package src;

import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Iterator;

public class CasamenteraFuerzaBruta extends Casamentera {


	private AbstractList<Persona> mujeres;


	
	public CasamenteraFuerzaBruta(TablaDePreferencias preferenciasHombres,
			TablaDePreferencias preferenciasMujeres) {
		super(preferenciasHombres, preferenciasMujeres);
		this.casados=false;
		this.mujeres= new ArrayList<Persona>();
		Iterator<Persona> itMujeres= this.preferenciasMujeres.getPersonas();
		while(itMujeres.hasNext()){
			mujeres.add(itMujeres.next());
		}
		

	}


	
	@Override
	public void casar() {
		rcasar(0);
		this.comprobarCasados();
	}
	

	private void rcasar(int Nmujer) {

		if(this.casados || Nmujer >= mujeres.size())
			return;

		Iterator<Persona> hombres= this.preferenciasHombres.getPersonas();
		Persona mujer= mujeres.get(Nmujer);

		while(hombres.hasNext() && !this.casados){

			Persona hombre= hombres.next();
			

			if(!hombre.enPareja()){
				hombre.casarseCon(mujer);

				if(this.esFactible(hombre)){
					rcasar(Nmujer + 1);
					comprobarCasados();
					// Si al terminar todas las llamadas aun no se casaron
					// la salida se produjo por un no factible
					if(!this.casados)
						mujer.separar();
				}
				else
					mujer.separar();
			}
		}
	}



	//verifica  si el hombre es estable con el resto 
	private boolean esFactible(Persona hombre) {
		Iterator<Persona> mujeres;		
		mujeres= this.preferenciasMujeres.getPersonas();
		while (mujeres.hasNext()){
			Persona mujerActual= mujeres.next();
			
			//verifico estabilidad
			if(!hombre.esEstableCon(mujerActual)&&mujerActual.enPareja())
				return false;
			//verifico que su pareja no sea ya pareja de otro 
			if(mujerActual.enPareja()&&hombre.getParejaActual()!=mujerActual && hombre==mujerActual.getParejaActual())
				return false;
		}
		return true;
	}

	private void comprobarCasados() {
		this.casados=true;
		Iterator<Persona> mujeres; 
		mujeres= this.preferenciasMujeres.getPersonas();
		while (mujeres.hasNext())
			if(!mujeres.next().enPareja())
				this.casados=false;
		
	}
	
}
